package com.example.smartwaterapi.service.impl;

import com.example.smartwaterapi.service.FileStorageService;
import com.example.smartwaterapi.utils.TosClientUtils;
import com.volcengine.tos.model.object.GetObjectV2Output;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * TOS文件存储服务实现 - 优化版本
 */
@Service("tosFileStorageService")
public class TosFileStorageServiceImpl implements FileStorageService {

    @Autowired
    private TosClientUtils tosClientUtils;

    @Value("${tos.bucket}")
    private String bucketName;

    @Value("${tos.endpoint}")
    private String endpoint;

    /**
     * 上传文件 - 自动设置为公开权限
     *
     * @param file   文件
     * @param folder 文件夹
     * @return 文件URL
     * @throws IOException IO异常
     */
    @Override
    public String uploadFile(MultipartFile file, String folder) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String filename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
        String objectKey = folder + "/" + filename;

        // 上传文件（自动设置为公开权限）
        tosClientUtils.uploadStream(objectKey, file.getInputStream(), file.getSize());
        return getFileUrl(objectKey);
    }

    /**
     * 上传文件 - 自动设置为公开权限
     *
     * @param inputStream 输入流
     * @param filename    文件名
     * @param folder      文件夹
     * @return 文件URL
     * @throws IOException IO异常
     */
    @Override
    public String uploadFile(InputStream inputStream, String filename, String folder) throws IOException {
        String objectKey = folder + "/" + filename;
        // 由于无法直接获取输入流的长度，需要先将输入流读入字节数组
        byte[] bytes = inputStream.readAllBytes();
        // 上传文件（自动设置为公开权限）
        tosClientUtils.uploadStream(objectKey, inputStream, bytes.length);
        return getFileUrl(objectKey);
    }

    /**
     * 上传字符串内容 - 自动设置为公开权限
     *
     * @param content  字符串内容
     * @param filename 文件名
     * @param folder   文件夹
     * @return 文件URL
     */
    @Override
    public String uploadString(String content, String filename, String folder) {
        String objectKey = folder + "/" + filename;
        // 上传字符串（自动设置为公开权限）
        tosClientUtils.uploadString(objectKey, content);
        return getFileUrl(objectKey);
    }

    /**
     * 删除文件
     *
     * @param fileUrl 文件URL
     */
    @Override
    public void deleteFile(String fileUrl) {
        String objectKey = getObjectKeyFromUrl(fileUrl);
        tosClientUtils.deleteObject(objectKey);
    }

    /**
     * 获取文件输入流
     *
     * @param fileUrl 文件URL
     * @return 文件输入流
     * @throws IOException IO异常
     */
    @Override
    public InputStream getFileInputStream(String fileUrl) throws IOException {
        String objectKey = getObjectKeyFromUrl(fileUrl);
        GetObjectV2Output output = tosClientUtils.downloadObject(objectKey);
        return output.getContent();
    }

    /**
     * 获取文件URL - 直接访问URL
     *
     * @param objectKey 对象键
     * @return 文件URL
     */
    private String getFileUrl(String objectKey) {
        return String.format("https://%s.%s/%s", bucketName, endpoint, objectKey);
    }

    /**
     * 从URL中获取对象键
     *
     * @param fileUrl 文件URL
     * @return 对象键
     */
    private String getObjectKeyFromUrl(String fileUrl) {
        String prefix = String.format("https://%s.%s/", bucketName, endpoint);
        if (fileUrl.startsWith(prefix)) {
            return fileUrl.substring(prefix.length());
        }
        return fileUrl;
    }
}